今天是第十二天可以寫一個斑馬魚使用者介面的視窗,以下是程式碼
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
from tkinter import simpledialog
import os
import shutil
def yolo_calculate(image_path, weight_file_path):
# 假設這是一個 YOLO 計算的函數
# 這裡放置你的 YOLO 計算邏輯
result_image_path = image_path # 這是個假設,實際上應該返回處理過的圖片路徑
return result_image_path
def select_file():
file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.gif")])
if file_path:
file_path_var.set(file_path)
def select_weight_file():
weight_file_path = filedialog.askopenfilename(filetypes=[("Weight Files", "*.weights")])
if weight_file_path:
weight_value_var.set(weight_file_path)
def perform_yolo():
file_path = file_path_var.get()
weight_file_path = weight_value_var.get()
result_image_path = yolo_calculate(file_path, weight_file_path)
load_image(result_image_path)
show_zebrafish_window()
def load_image(image_path):
try:
img = tk.PhotoImage(file=image_path)
image_label.config(image=img)
image_label.image = img
except Exception as e:
messagebox.showerror("錯誤", f"無法加載圖片: {e}")
def show_zebrafish_window():
new_window = tk.Toplevel(root)
new_window.title("斑馬魚分析")
new_window.configure(bg='lightblue')
# 設置新視窗的列和行,使其可以動態調整大小
for i in range(2):
new_window.grid_columnconfigure(i, weight=1)
for i in range(4): # 增加一行用來顯示下載按鈕
new_window.grid_rowconfigure(i, weight=1)
ttk.Button(new_window, text="斑馬魚運動軌跡影片", command=zebrafish_video).grid(row=0, column=0, columnspan=2, padx=10, pady=10, sticky="ew")
ttk.Button(new_window, text="正常佔比", command=lambda: zebrafish_behavior("Normal")).grid(row=1, column=0, padx=5, pady=5, sticky="ew")
ttk.Button(new_window, text="害怕佔比", command=lambda: zebrafish_behavior("Fear")).grid(row=1, column=1, padx=5, pady=5, sticky="ew")
ttk.Button(new_window, text="焦慮佔比", command=lambda: zebrafish_behavior("Anxiety")).grid(row=2, column=0, padx=5, pady=5, sticky="ew")
ttk.Button(new_window, text="壓抑佔比", command=lambda: zebrafish_behavior("Depression")).grid(row=2, column=1, padx=5, pady=5, sticky="ew")
ttk.Button(new_window, text="下載影片", command=download_video).grid(row=3, column=0, columnspan=2, padx=10, pady=10, sticky="ew")
def zebrafish_video():
# Placeholder for zebrafish video tracking logic
messagebox.showinfo("斑馬魚影片", "斑馬魚運動軌跡計算完成。")
def zebrafish_behavior(behavior_type):
# Placeholder for zebrafish behavior calculation logic
messagebox.showinfo("斑馬魚行為", f"斑馬魚行為 ({behavior_type}) 計算完成。")
def download_video():
# Placeholder for video download logic
video_path = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("MP4 Files", "*.mp4")])
if video_path:
# 假設這裡有個虛擬的影片路徑
temp_video_path = "path_to_your_video.mp4" # 替換為實際的影片路徑
if os.path.exists(temp_video_path):
try:
shutil.copy(temp_video_path, video_path)
messagebox.showinfo("成功", "影片已成功下載。")
except Exception as e:
messagebox.showerror("錯誤", f"下載影片時發生錯誤: {e}")
else:
messagebox.showerror("錯誤", "找不到影片文件。")
# 建立主視窗
root = tk.Tk()
root.title("YOLO 和 LSTM 圖形界面")
root.configure(bg='lightblue') # 設定背景顏色為淺藍色
# 檔案路徑變數
file_path_var = tk.StringVar()
weight_value_var = tk.StringVar()
result_var = tk.StringVar()
# 設置根容器的列和行,使其可以動態調整大小
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)
# 創建一個框架以容納所有的小部件
main_frame = ttk.Frame(root, padding="10")
main_frame.grid(row=0, column=0, sticky="nsew")
main_frame.configure(style="Main.TFrame")
# 設置 main_frame 的列和行,使其可以動態調整大小
for i in range(3):
main_frame.grid_columnconfigure(i, weight=1)
for i in range(9):
main_frame.grid_rowconfigure(i, weight=1)
# 設置樣式
style = ttk.Style()
style.configure("TFrame", background='lightblue')
style.configure("TLabel", background='lightblue')
style.configure("TButton", background='lightblue')
# 檔案選擇
ttk.Label(main_frame, text="Select Image/Video:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
ttk.Entry(main_frame, textvariable=file_path_var, width=50).grid(row=0, column=1, padx=5, pady=5, sticky="ew")
ttk.Button(main_frame, text="Browse", command=select_file).grid(row=0, column=2, padx=5, pady=5, sticky="w")
# 權重值選擇
ttk.Label(main_frame, text="Select Weight Value:").grid(row=1, column=0, padx=5, pady=5, sticky="e")
ttk.Entry(main_frame, textvariable=weight_value_var, width=50).grid(row=1, column=1, padx=5, pady=5, sticky="ew")
ttk.Button(main_frame, text="Browse", command=select_weight_file).grid(row=1, column=2, padx=5, pady=5, sticky="w")
# YOLO 計算按鈕
ttk.Button(main_frame, text="YOLO 辨識結果", command=perform_yolo).grid(row=2, column=1, padx=5, pady=5, sticky="ew")
# 圖像顯示
image_label = ttk.Label(main_frame)
image_label.grid(row=4, column=0, columnspan=3, padx=5, pady=5, sticky="nsew")
# 啟動主迴圈
root.mainloop()
import tkinter as tk
from tkinter import filedialog, messagebox, ttk, simpledialog
import os
import shutil
這些匯入語句導入了 tkinter
模組中的不同組件以及一些標準 Python 庫,用於建立 GUI、處理文件對話框、顯示消息框、操作文件系統等。
def yolo_calculate(image_path, weight_file_path):
# 假設這是一個 YOLO 計算的函數
# 這裡放置你的 YOLO 計算邏輯
result_image_path = image_path # 這是個假設,實際上應該返回處理過的圖片路徑
return result_image_path
這是一個假設的 YOLO 計算函數。實際的 YOLO 計算邏輯應該放在這裡,當前它只是返回輸入的圖像路徑。
def select_file():
file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.gif")])
if file_path:
file_path_var.set(file_path)
這個函數打開一個文件選擇對話框,讓用戶選擇一個圖像文件(限制為 .gif
格式)。選擇後,將文件路徑存儲在 file_path_var
變數中。
def select_weight_file():
weight_file_path = filedialog.askopenfilename(filetypes=[("Weight Files", "*.weights")])
if weight_file_path:
weight_value_var.set(weight_file_path)
這個函數打開一個文件選擇對話框,讓用戶選擇一個權重文件(.weights
格式)。選擇後,將文件路徑存儲在 weight_value_var
變數中。
def perform_yolo():
file_path = file_path_var.get()
weight_file_path = weight_value_var.get()
result_image_path = yolo_calculate(file_path, weight_file_path)
load_image(result_image_path)
show_zebrafish_window()
這個函數會根據用戶選擇的圖像和權重文件路徑,執行 YOLO 計算,然後顯示處理後的圖像,並打開一個新的視窗進行斑馬魚行為分析。
def load_image(image_path):
try:
img = tk.PhotoImage(file=image_path)
image_label.config(image=img)
image_label.image = img
except Exception as e:
messagebox.showerror("錯誤", f"無法加載圖片: {e}")
這個函數試圖加載並顯示處理後的圖像。如果加載失敗,將顯示錯誤消息。
def show_zebrafish_window():
new_window = tk.Toplevel(root)
new_window.title("斑馬魚分析")
new_window.configure(bg='lightblue')
# 設置新視窗的列和行,使其可以動態調整大小
for i in range(2):
new_window.grid_columnconfigure(i, weight=1)
for i in range(4): # 增加一行用來顯示下載按鈕
new_window.grid_rowconfigure(i, weight=1)
ttk.Button(new_window, text="斑馬魚運動軌跡影片", command=zebrafish_video).grid(row=0, column=0, columnspan=2, padx=10, pady=10, sticky="ew")
ttk.Button(new_window, text="正常佔比", command=lambda: zebrafish_behavior("Normal")).grid(row=1, column=0, padx=5, pady=5, sticky="ew")
ttk.Button(new_window, text="害怕佔比", command=lambda: zebrafish_behavior("Fear")).grid(row=1, column=1, padx=5, pady=5, sticky="ew")
ttk.Button(new_window, text="焦慮佔比", command=lambda: zebrafish_behavior("Anxiety")).grid(row=2, column=0, padx=5, pady=5, sticky="ew")
ttk.Button(new_window, text="壓抑佔比", command=lambda: zebrafish_behavior("Depression")).grid(row=2, column=1, padx=5, pady=5, sticky="ew")
ttk.Button(new_window, text="下載影片", command=download_video).grid(row=3, column=0, columnspan=2, padx=10, pady=10, sticky="ew")
這個函數創建一個新的視窗,提供多個按鈕供用戶選擇,來計算並顯示斑馬魚的不同行為比例,並且增加了一個按鈕允許用戶下載影片。
def zebrafish_video():
messagebox.showinfo("斑馬魚影片", "斑馬魚運動軌跡計算完成。")
def zebrafish_behavior(behavior_type):
messagebox.showinfo("斑馬魚行為", f"斑馬魚行為 ({behavior_type}) 計算完成。")
這些是用於斑馬魚影片處理和行為分析的佔位函數,當前只是顯示消息,實際的處理邏輯應該在這裡實現。
def download_video():
video_path = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("MP4 Files", "*.mp4")])
if video_path:
temp_video_path = "path_to_your_video.mp4" # 替換為實際的影片路徑
if os.path.exists(temp_video_path):
try:
shutil.copy(temp_video_path, video_path)
messagebox.showinfo("成功", "影片已成功下載。")
except Exception as e:
messagebox.showerror("錯誤", f"下載影片時發生錯誤: {e}")
else:
messagebox.showerror("錯誤", "找不到影片文件。")
這個函數允許用戶下載影片。用戶可以選擇保存位置,如果影片存在,將其複製到用戶指定的位置;否則,顯示錯誤消息。
root = tk.Tk()
root.title("YOLO 和 LSTM 圖形界面")
root.configure(bg='lightblue')
這段程式碼創建了主視窗,並設置了視窗的標題和背景顏色。
# 創建框架和設置控件
這些代碼設置了主視窗內的布局和各種控件,包括文件選擇、權重選擇以及 YOLO 計算按鈕等。
root.mainloop()
最後,這行程式碼啟動了 GUI 的主事件循環,使得視窗可以保持顯示並回應用戶的操作。